<!DOCTYPE html>
            
<HTML>
<HEAD>
<meta name="booktitle" content="Developing Applications With Objective Caml" >
 <meta charset="ISO-8859-1"><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
<META name="GENERATOR" content="hevea 1.05-7 of 2000-02-24">
<META NAME="Author" CONTENT="Christian.Queinnec@lip6.fr">
<LINK rel=stylesheet type="text/css" href="videoc-ocda.css">
<script language="JavaScript" src="videoc.js"><!--
//--></script>
<TITLE>
 Exercises
</TITLE>
</HEAD>
<BODY class="regularBody">
<A HREF="book-ora178.html"><IMG SRC ="previous_motif.gif" ALT="Previous"></A>
<A HREF="index.html"><IMG SRC ="contents_motif.gif" ALT="Contents"></A>
<A HREF="book-ora180.html"><IMG SRC ="next_motif.gif" ALT="Next"></A>
<HR>

<H2> Exercises</H2> 
<A NAME="toc269"></A>
<H3> The Philosophers Disentangled</H3>
<A NAME="exo-philo"></A> 
To solve the possible deadlock of the dining philosophers, it suffices to 
limit access to the table to four at once. 
Implement this <A id="a300__1_APPEND/PCcor.ml.tex" href="javascript: void showMessage('1_APPEND/PCcor.ml.tex')" class="mousable"><SPAN style=""><!-- 1,APPEND/PCcor.ml.tex,philo-deb -->solution</SPAN></A>.  
<!-- POPUP DEFINITION -->
<layer id="l__1_APPEND/PCcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","1_APPEND/PCcor.ml.tex","");
// --></script><span style="">
 We add a counter indicating the number of philosophers present
as well as two functions, <TT>enter</TT> and <TT>leave</TT>,
tasked with limiting arrivals, and signalling departures, respectively.


<PRE><BR>#<BR><CODE> </CODE><BR><CODE> </CODE><B>let</B><CODE> </CODE>enter<CODE>,</CODE><CODE> </CODE>leave<CODE> </CODE><CODE>=</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>n<CODE> </CODE><CODE>=</CODE><CODE> </CODE>ref<CODE> </CODE><CODE>0</CODE><CODE> </CODE><B>in</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>m<CODE> </CODE><CODE>=</CODE><CODE> </CODE>Mutex.create()<CODE> </CODE><B>in</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>c<CODE> </CODE><CODE>=</CODE><CODE> </CODE>Condition.create()<CODE> </CODE><B>in</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>loc_enter<CODE> </CODE>()<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Mutex.lock<CODE> </CODE>m<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>while</B><CODE> </CODE>not<CODE> </CODE><TT>(</TT><CODE>!</CODE>n<CODE> </CODE><CODE>&lt;</CODE><CODE> </CODE><CODE>4</CODE><TT>)</TT><CODE> </CODE><B>do</B><CODE> </CODE>Condition.wait<CODE> </CODE>c<CODE> </CODE>m<CODE> </CODE><B>done</B><CODE> </CODE>;<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>incr<CODE> </CODE>n<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>if</B><CODE> </CODE><CODE>!</CODE>n<CODE> </CODE><CODE>&gt;</CODE><CODE> </CODE><CODE>1</CODE><CODE> </CODE><B>then</B><CODE> </CODE>Printf.printf<CODE> </CODE><CODE>"%d philosophers are at the table\n"</CODE><CODE> </CODE><CODE>!</CODE>n<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>else</B><CODE> </CODE>Printf.printf<CODE> </CODE><CODE>"%d philosopher is at the table\n"</CODE><CODE> </CODE><CODE>!</CODE>n<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>flush<CODE> </CODE>stdout;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Mutex.unlock<CODE> </CODE>m<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>in</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>loc_leave<CODE> </CODE>()<CODE> </CODE><CODE>=</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Mutex.lock<CODE> </CODE>m<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>decr<CODE> </CODE>n<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Mutex.unlock<CODE> </CODE>m<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Condition.broadcast<CODE> </CODE>c<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>in</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE>loc_enter<CODE>,</CODE><CODE> </CODE>loc_leave<CODE> </CODE>;;<BR><CODE>val enter : unit -&gt; unit = &lt;fun&gt;</CODE><BR><CODE>val leave : unit -&gt; unit = &lt;fun&gt;</CODE><BR>

</PRE>

Then all that is necessary is to call these functions at the start and
end of the loop of a philosopher.


<PRE><BR># <B>let</B><CODE> </CODE>philosopher<CODE> </CODE>i<CODE> </CODE><CODE>=</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>ii<CODE> </CODE><CODE>=</CODE><CODE> </CODE><TT>(</TT>i<CODE>+</CODE><CODE>1</CODE><TT>)</TT><CODE> </CODE><B>mod</B><CODE> </CODE><CODE>4</CODE><CODE> </CODE><B>in</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>while</B><CODE> </CODE><B>true</B><CODE> </CODE><B>do</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Printf.printf<CODE> </CODE><CODE>"Philosopher (%d) arrives\n"</CODE><CODE> </CODE>i<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>enter<CODE> </CODE>()<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>meditate<CODE> </CODE><CODE>3</CODE><CODE>.</CODE><CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Mutex.lock<CODE> </CODE>b<CODE>.</CODE><TT>(</TT>i<TT>)</TT>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Printf.printf<CODE> </CODE><BR><CODE> </CODE><CODE>"Philosopher (%d) picks up his left-hand baguette and meditates a while longer\n"</CODE><CODE> </CODE>i;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>meditate<CODE> </CODE><CODE>0</CODE><CODE>.</CODE><CODE>2</CODE>;<CODE> </CODE>Mutex.lock<CODE> </CODE>b<CODE>.</CODE><TT>(</TT>ii<TT>)</TT><CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Printf.printf<CODE> </CODE><CODE>"Philosopher (%d) picks up his right-hand baguette\n"</CODE><CODE> </CODE>i<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>eat<CODE> </CODE><CODE>0</CODE><CODE>.</CODE><CODE>5</CODE><CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Mutex.unlock<CODE> </CODE>b<CODE>.</CODE><TT>(</TT>i<TT>)</TT><CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Printf.printf<CODE> </CODE><BR><CODE> </CODE><CODE>"Philosopher (%d) puts down his left-hand baguette and goes back to meditating\n"</CODE><CODE> </CODE>i;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>meditate<CODE> </CODE><CODE>0</CODE><CODE>.</CODE><CODE>1</CODE><CODE>5</CODE><CODE> </CODE>;<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Mutex.unlock<CODE> </CODE>b<CODE>.</CODE><TT>(</TT>ii<TT>)</TT><CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Printf.printf<CODE> </CODE><CODE>"Philosopher (%d) puts down his right-hand baguette"</CODE><CODE> </CODE>i<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>leave<CODE> </CODE>()<CODE> </CODE>;<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Printf.printf<CODE> </CODE><CODE>"Philosophe (%d) heads off \n"</CODE><CODE> </CODE>i<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>done</B><CODE> </CODE>;;<BR><CODE>val philosopher : int -&gt; unit = &lt;fun&gt;</CODE><BR>

</PRE>

Attention, cette solution supprime les inter-blocages, mais pas les
famines. Pour r�soudre ce dernier probl�me, on peut soit se fier
au hasard en introduisant un d�lai d'attente en apr�s la sortie
d'un philosophe, soit g�rer explicitement une file d'attente.
</span><script language="JavaScript"><!--
  closePopUp("1_APPEND/PCcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script><BR>
<BR>
<A NAME="toc270"></A>
<H3> More of the Post Office</H3> 
We suggest the following modification to the post office described on page 
<A HREF="book-ora178.html#sec-poste">??</A>: some impatient clients may leave before there number 
has been called. 
<OL type=1>
<LI> 
 Add a method <TT>wait</TT> (with type <I>int -&gt; unit</I>) to the 
class <TT><A id="a301__2_APPEND/PCcor.ml.tex" href="javascript: void showMessage('2_APPEND/PCcor.ml.tex')" class="mousable"><SPAN style=""><!-- 2,APPEND/PCcor.ml.tex,distrib -->dispenser</SPAN></A></TT> which causes the caller to  
wait while the last number distributed is less than or equal to the parameter 
of the method (it is necessary to modify <TT>take</TT> so that it 
emits a signal). 
<!-- POPUP DEFINITION -->
<layer id="l__2_APPEND/PCcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","2_APPEND/PCcor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>class</B><CODE> </CODE>distrib<CODE> </CODE>()<CODE> </CODE><CODE>=</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>object</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>val</B><CODE> </CODE><B>mutable</B><CODE> </CODE>n<CODE> </CODE><CODE>=</CODE><CODE> </CODE><CODE>0</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>val</B><CODE> </CODE>m<CODE> </CODE><CODE>=</CODE><CODE> </CODE>Mutex.create<CODE> </CODE>()<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>val</B><CODE> </CODE>c<CODE> </CODE><CODE>=</CODE><CODE> </CODE>Condition.create<CODE> </CODE>()<BR><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>attendre<CODE> </CODE>nc<CODE> </CODE><CODE>=</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Mutex.lock<CODE> </CODE>m<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>while</B><CODE> </CODE><TT>(</TT>n<CODE> </CODE><CODE>&lt;=</CODE><CODE> </CODE>nc<TT>)</TT><CODE> </CODE><B>do</B><CODE> </CODE>Condition.wait<CODE> </CODE>c<CODE> </CODE>m<CODE> </CODE><B>done</B><CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Mutex.unlock<CODE> </CODE>m<BR><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>prendre<CODE> </CODE>()<CODE> </CODE><CODE>=</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Mutex.lock<CODE> </CODE>m<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>n<CODE> </CODE><CODE>&lt;-</CODE><CODE> </CODE>n<CODE>+</CODE><CODE>1</CODE><CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>nn<CODE> </CODE><CODE>=</CODE><CODE> </CODE>n<CODE> </CODE><B>in</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Condition.broadcast<CODE> </CODE>c<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Mutex.unlock<CODE> </CODE>m<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>nn<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>end</B><CODE> </CODE>;;<BR><CODE>class distrib :</CODE><BR><CODE>  unit -&gt;</CODE><BR><CODE>  object</CODE><BR><CODE>    val c : Condition.t</CODE><BR><CODE>    val m : Mutex.t</CODE><BR><CODE>    val mutable n : int</CODE><BR><CODE>    method attendre : int -&gt; unit</CODE><BR><CODE>    method prendre : unit -&gt; int</CODE><BR><CODE>  end</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("2_APPEND/PCcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script>
<LI> Modify the method <TT><A id="a302__3_APPEND/PCcor.ml.tex" href="javascript: void showMessage('3_APPEND/PCcor.ml.tex')" class="mousable"><SPAN style=""><!-- 3,APPEND/PCcor.ml.tex,arrivee -->await_arrival</SPAN></A></TT>  
of class <TT>counter</TT>, so that it returns the boolean value 
<TT>true</TT> if the expected client arrives, and <TT>false</TT> if the 
client has not arrived at the end of a certain time. 
<!-- POPUP DEFINITION -->
<layer id="l__3_APPEND/PCcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","3_APPEND/PCcor.ml.tex","");
// --></script><span style="">
 On rajoute une m�thode priv�e <TT>reveil</TT> charg�e de
r�veiller le guichetier en attente au bout d'un temps donn�.


<PRE><BR>#<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE><B>private</B><CODE> </CODE>reveil<CODE> </CODE>t<CODE> </CODE><CODE>=</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>dt<CODE> </CODE><CODE>=</CODE><CODE> </CODE>delai_attente_appel<CODE> </CODE><CODE>/.</CODE><CODE> </CODE><CODE>1</CODE><CODE>0</CODE><CODE>.</CODE><CODE>0</CODE><CODE> </CODE><B>in</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>while</B><CODE> </CODE><TT>(</TT>Unix.gettimeofday()<CODE> </CODE><CODE>&lt;</CODE><CODE> </CODE>t<TT>)</TT><CODE> </CODE><B>do</B><CODE> </CODE>Thread.delay<CODE> </CODE>dt<CODE> </CODE><B>done</B>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Condition.signal<CODE> </CODE>c<BR><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>attendre_arrivee<CODE> </CODE>()<CODE> </CODE><CODE>=</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>t<CODE> </CODE><CODE>=</CODE><CODE> </CODE>Unix.gettimeofday()<CODE> </CODE><CODE>+.</CODE><CODE> </CODE>delai_attente_appel<CODE> </CODE><B>in</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>r<CODE> </CODE><CODE>=</CODE><CODE> </CODE>Thread.create<CODE> </CODE>self#reveil<CODE> </CODE>t<CODE> </CODE><B>in</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Mutex.lock<CODE> </CODE>m;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>while</B><CODE> </CODE>libre<CODE> </CODE><CODE>&amp;&amp;</CODE><CODE> </CODE><TT>(</TT>Unix.gettimeofday()<CODE> </CODE><CODE>&lt;</CODE><CODE> </CODE>t<TT>)</TT><CODE> </CODE><B>do</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Condition.wait<CODE> </CODE>c<CODE> </CODE>m<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>done</B>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><TT>(</TT><B>try</B><CODE> </CODE>Thread.kill<CODE> </CODE>r<CODE> </CODE><B>with</B><CODE> </CODE><CODE>_</CODE><CODE> </CODE>-&gt;<CODE> </CODE>()<TT>)</TT>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>b<CODE> </CODE><CODE>=</CODE><CODE> </CODE>not<CODE> </CODE>libre<CODE> </CODE><B>in</B><CODE> </CODE><TT>(</TT>Mutex.unlock<CODE> </CODE>m;<CODE> </CODE>b<TT>)</TT><BR><CODE> </CODE>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("3_APPEND/PCcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script>
<LI> Modify the class <TT><A id="a303__4_APPEND/PCcor.ml.tex" href="javascript: void showMessage('4_APPEND/PCcor.ml.tex')" class="mousable"><SPAN style=""><!-- 4,APPEND/PCcor.ml.tex,affich -->announcer</SPAN></A></TT>  
by passing it a number dispenser as a parameter and: 
<OL type=a>
<LI> 
 adding a method <TT>wait_until</TT> 
which returns <TT>true</TT> if the expected number has been called during 
a given waiting period, 
and <TT>false</TT> otherwise; 
<!-- POPUP DEFINITION -->
<layer id="l__4_APPEND/PCcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","4_APPEND/PCcor.ml.tex","");
// --></script><span style="">
 La modification de la m�thode <TT>appel</TT> a pour but de garantir
� la fois que ne sont appel�s que des num�ros effectivement
distribu�s et que lorsqu'un num�ro d'appel est affich�, il
existe bien un guichet qui attend ce num�ro. 


<PRE><BR># <B>class</B><CODE> </CODE>affich<CODE> </CODE><TT>(</TT>d<CODE>:</CODE>distrib<TT>)</TT><CODE> </CODE><CODE>=</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>object</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>val</B><CODE> </CODE><B>mutable</B><CODE> </CODE>nc<CODE> </CODE><CODE>=</CODE><CODE> </CODE><CODE>0</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>val</B><CODE> </CODE>m<CODE> </CODE><CODE>=</CODE><CODE> </CODE>Mutex.create<CODE> </CODE>()<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>val</B><CODE> </CODE>c<CODE> </CODE><CODE>=</CODE><CODE> </CODE>Condition.create<CODE> </CODE>()<BR><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>attendre<CODE> </CODE>n<CODE> </CODE><CODE>=</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Mutex.lock<CODE> </CODE>m<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>while</B><CODE> </CODE>nc<CODE> </CODE><CODE>&lt;</CODE><CODE> </CODE>n<CODE> </CODE><B>do</B><CODE> </CODE>Condition.wait<CODE> </CODE>c<CODE> </CODE>m<CODE> </CODE><B>done</B><CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Mutex.unlock<CODE> </CODE>m<CODE> </CODE><BR><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>attendre_jusqu<I>'a</I><CODE> </CODE>n<CODE> </CODE>t<CODE> </CODE><CODE>=</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Mutex.lock<CODE> </CODE>m<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>while</B><CODE> </CODE><TT>(</TT>nc<CODE> </CODE><CODE>&lt;</CODE><CODE> </CODE>n<TT>)</TT><CODE> </CODE><CODE>&amp;&amp;</CODE><CODE> </CODE><TT>(</TT>Unix.gettimeofday()<CODE> </CODE><CODE>&lt;</CODE><CODE> </CODE>t<TT>)</TT><CODE> </CODE><B>do</B><CODE> </CODE>Condition.wait<CODE> </CODE>c<CODE> </CODE>m<CODE> </CODE><B>done</B><CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>b<CODE> </CODE><CODE>=</CODE><CODE> </CODE>not<CODE> </CODE><TT>(</TT>nc<CODE> </CODE><CODE>&lt;</CODE><CODE> </CODE>n<TT>)</TT><CODE> </CODE><B>in</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Mutex.unlock<CODE> </CODE>m<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>b<BR><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>appel<CODE> </CODE><TT>(</TT>g<CODE>:</CODE>guichet<TT>)</TT><CODE> </CODE><CODE>=</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Mutex.lock<CODE> </CODE>m<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>d#attendre<CODE> </CODE>nc<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>nc<CODE> </CODE><CODE>&lt;-</CODE><CODE> </CODE>nc<CODE>+</CODE><CODE>1</CODE><CODE> </CODE>;<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>g#set_nc<CODE> </CODE>nc<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Condition.broadcast<CODE> </CODE>c<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Mutex.unlock<CODE> </CODE>m<CODE> </CODE><BR><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>end</B><CODE> </CODE>;;<BR><CODE>class affich :</CODE><BR><CODE>  distrib -&gt;</CODE><BR><CODE>  object</CODE><BR><CODE>    val c : Condition.t</CODE><BR><CODE>    val m : Mutex.t</CODE><BR><CODE>    val mutable nc : int</CODE><BR><CODE>    method appel : guichet -&gt; unit</CODE><BR><CODE>    method attendre : int -&gt; unit</CODE><BR><CODE>    method attendre_jusqu'a : int -&gt; float -&gt; bool</CODE><BR><CODE>  end</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("4_APPEND/PCcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script>
<LI> modifying the method <TT>call</TT> to take a counter as parameter 
and update the field <TT>nclient</TT> of this counter (it is necessary to 
add an update method in the <TT>counter</TT> 
class). <BR>
<BR>
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script></OL> <BR>

<LI> Modify the function <TT><A id="a304__5_APPEND/PCcor.ml.tex" href="javascript: void showMessage('5_APPEND/PCcor.ml.tex')" class="mousable"><SPAN style=""><!-- 5,APPEND/PCcor.ml.tex,clerk -->clerk</SPAN></A></TT>  
to take fruitless waits into account. 
<!-- POPUP DEFINITION -->
<layer id="l__5_APPEND/PCcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","5_APPEND/PCcor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <CODE>type bureau = { d: distrib; a: affich; gs: guichet array }</CODE><BR><CODE>val delai_service : float = 4</CODE><BR><CODE>val delai_arrivee : float = 2</CODE><BR><CODE>val delai_guichet : float = 0.5</CODE><BR><CODE>val delai_attente_client : float = 0.7</CODE><BR><BR><CODE> </CODE><B>let</B><CODE> </CODE>guichetier<CODE> </CODE><TT>(</TT><TT>(</TT>a<CODE> </CODE><CODE>:</CODE><CODE> </CODE>affich<TT>)</TT><CODE>,</CODE><CODE> </CODE><TT>(</TT>g<CODE> </CODE><CODE>:</CODE><CODE> </CODE>guichet<TT>)</TT><TT>)</TT><CODE> </CODE><CODE>=</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>while</B><CODE> </CODE><B>true</B><CODE> </CODE><B>do</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>a#appel<CODE> </CODE>g<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Printf.printf<CODE>"Guichet %d appelle %d\n"</CODE><CODE> </CODE>g#get_ng<CODE> </CODE>g#get_nc<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>if</B><CODE> </CODE>g#attendre_arrivee<CODE> </CODE>()<CODE> </CODE><B>then</B><CODE> </CODE>g#attendre_depart<CODE> </CODE>()<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>else</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>begin</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Printf.printf<CODE>"Guichet %d n'attend plus %d\n"</CODE><CODE> </CODE>g#get_ng<CODE> </CODE>g#get_nc<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>flush<CODE> </CODE>stdout<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>end</B><CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Thread.delay<CODE> </CODE><TT>(</TT>Random.float<CODE> </CODE>delai_guichet<TT>)</TT><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>done</B><CODE> </CODE>;;<BR><CODE>val guichetier : affich * guichet -&gt; unit = &lt;fun&gt;</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("5_APPEND/PCcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script>
<LI> Write a function <TT><A id="a305__6_APPEND/PCcor.ml.tex" href="javascript: void showMessage('6_APPEND/PCcor.ml.tex')" class="mousable"><SPAN style=""><!-- 6,APPEND/PCcor.ml.tex,impatient -->impatient_client</SPAN></A></TT>  
which simulates the behaviour of an impatient client. 
<!-- POPUP DEFINITION -->
<layer id="l__6_APPEND/PCcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","6_APPEND/PCcor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <CODE>val chercher_guichet : 'a -&gt; &lt; get_nc : 'a; .. &gt; array -&gt; int = &lt;fun&gt;</CODE><BR><BR><CODE> </CODE><B>let</B><CODE> </CODE>client_impatient<CODE> </CODE>b<CODE> </CODE><CODE>=</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>n<CODE> </CODE><CODE>=</CODE><CODE> </CODE>b<CODE>.</CODE>d#prendre()<CODE> </CODE><B>in</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>t<CODE> </CODE><CODE>=</CODE><CODE> </CODE>Unix.gettimeofday()<CODE> </CODE><CODE>+.</CODE><CODE> </CODE><TT>(</TT>Random.float<CODE> </CODE>delai_attente_client<TT>)</TT><CODE> </CODE><B>in</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE>Printf.printf<CODE> </CODE><CODE>"Arrivee client impatient %d\n"</CODE><CODE> </CODE>n;<CODE> </CODE>flush<CODE> </CODE>stdout;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>if</B><CODE> </CODE>b<CODE>.</CODE>a#attendre_jusqu<I>'a</I><CODE> </CODE>n<CODE> </CODE>t<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>then</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>ig<CODE> </CODE><CODE>=</CODE><CODE> </CODE>chercher_guichet<CODE> </CODE>n<CODE> </CODE>b<CODE>.</CODE>gs<CODE> </CODE><B>in</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>b<CODE>.</CODE>gs<CODE>.</CODE><TT>(</TT>ig<TT>)</TT>#arriver()<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Printf.printf<CODE> </CODE><CODE>"Le client %d occupe le guichet %d\n"</CODE><CODE> </CODE>n<CODE> </CODE>ig<CODE> </CODE>;<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>flush<CODE> </CODE>stdout<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Thread.delay<CODE> </CODE><TT>(</TT>Random.float<CODE> </CODE>delai_service<TT>)</TT><CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>b<CODE>.</CODE>gs<CODE>.</CODE><TT>(</TT>ig<TT>)</TT>#partir()<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Printf.printf<CODE> </CODE><CODE>"Le client %d s'en va\n"</CODE><CODE> </CODE>n<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>else</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Printf.printf<CODE> </CODE><CODE>"Le client %d, las d'attendre, s'en va\n"</CODE><CODE> </CODE>n<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE>flush<CODE> </CODE>stdout<CODE> </CODE>;;<CODE> </CODE><CODE> </CODE><BR><CODE>Characters 518-531:</CODE><BR><CODE>This function is applied to too many arguments</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("6_APPEND/PCcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script></OL> <A NAME="toc271"></A>
<H3> Object Producers and Consumers</H3> 
This exercise revisits the producer-consumer algorithm with the 
following variation: 
the storage warehouse is of finite size (i.e. a table rather 
than a list managed as a FIFO). 
Also, we propose to make an implementation that uses objects to 
model resources, like the post office. <BR>
<BR>
<OL type=1>
<LI> 
 Define a class <TT><A id="a306__7_APPEND/PCcor.ml.tex" href="javascript: void showMessage('7_APPEND/PCcor.ml.tex')" class="mousable"><SPAN style=""><!-- 7,APPEND/PCcor.ml.tex,product -->product</SPAN></A></TT> with signature:  
<!-- POPUP DEFINITION -->
<layer id="l__7_APPEND/PCcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","7_APPEND/PCcor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>class</B><CODE> </CODE>produit<CODE> </CODE><TT>(</TT>s<CODE>:</CODE>string<TT>)</TT><CODE> </CODE><CODE>=</CODE><BR><CODE> </CODE><B>object</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>val</B><CODE> </CODE>nom<CODE> </CODE><CODE>=</CODE><CODE> </CODE>s<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>nom<CODE> </CODE><CODE>=</CODE><CODE> </CODE>nom<BR><CODE> </CODE><B>end</B><CODE> </CODE>;;<BR><CODE>class produit : string -&gt; object val nom : string method nom : string end</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("7_APPEND/PCcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script>

<PRE>
<CODE> </CODE><BR><B>class</B><CODE> </CODE>product<CODE> </CODE><CODE>:</CODE><CODE> </CODE>string<CODE> </CODE>-&gt;<CODE> </CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><B>object</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>val</B><CODE> </CODE>name<CODE> </CODE><CODE>:</CODE><CODE> </CODE>string<CODE> </CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>name<CODE> </CODE><CODE>:</CODE><CODE> </CODE>string<CODE> </CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><B>end</B><CODE> </CODE><CODE> </CODE><BR>

</PRE>
 

<LI> Define a class <TT><A id="a307__8_APPEND/PCcor.ml.tex" href="javascript: void showMessage('8_APPEND/PCcor.ml.tex')" class="mousable"><SPAN style=""><!-- 8,APPEND/PCcor.ml.tex,magasin -->shop</SPAN></A></TT> such that:  
<!-- POPUP DEFINITION -->
<layer id="l__8_APPEND/PCcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","8_APPEND/PCcor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>class</B><CODE> </CODE>magasin<CODE> </CODE>n<CODE> </CODE><CODE>=</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>object</B><TT>(</TT>self<TT>)</TT><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>val</B><CODE> </CODE><B>mutable</B><CODE> </CODE>taille<CODE> </CODE><CODE>=</CODE><CODE> </CODE>n;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>val</B><CODE> </CODE><B>mutable</B><CODE> </CODE>np<CODE> </CODE><CODE>=</CODE><CODE> </CODE><CODE>0</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>val</B><CODE> </CODE><B>mutable</B><CODE> </CODE>buffer<CODE> </CODE><CODE>=</CODE><CODE> </CODE><TT>(</TT><CODE>[||]</CODE><CODE> </CODE><CODE>:</CODE><CODE> </CODE>produit<CODE> </CODE>array<TT>)</TT><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>val</B><CODE> </CODE><B>mutable</B><CODE> </CODE>ip<CODE> </CODE><CODE>=</CODE><CODE> </CODE><CODE>0</CODE><CODE> </CODE><CODE> </CODE><CODE>(* Indice producteur *)</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>val</B><CODE> </CODE><B>mutable</B><CODE> </CODE>ic<CODE> </CODE><CODE>=</CODE><CODE> </CODE><CODE>0</CODE><CODE> </CODE><CODE> </CODE><CODE>(* Indice consommateur *)</CODE><BR><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>val</B><CODE> </CODE>m<CODE> </CODE><CODE>=</CODE><CODE> </CODE>Mutex.create<CODE> </CODE>()<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>val</B><CODE> </CODE>c<CODE> </CODE><CODE>=</CODE><CODE> </CODE>Condition.create<CODE> </CODE>()<BR><CODE> </CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>initializer</B><CODE> </CODE>buffer<CODE>&lt;-</CODE>Array.create<CODE> </CODE>n<CODE> </CODE><TT>(</TT><B>new</B><CODE> </CODE>produit<CODE> </CODE><CODE>"empty"</CODE><TT>)</TT><BR><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>display1<CODE> </CODE>()<CODE> </CODE><CODE>=</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>i<CODE> </CODE><CODE>=</CODE><CODE> </CODE>ip<CODE> </CODE><B>mod</B><CODE> </CODE>taille<CODE> </CODE><B>in</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Printf.printf<CODE> </CODE><CODE>"Ajout (%d)%s\n"</CODE><CODE> </CODE>i<CODE> </CODE><TT>(</TT><TT>(</TT>buffer<CODE>.</CODE><TT>(</TT>i<TT>)</TT><TT>)</TT>#nom<TT>)</TT><BR><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>deposer<CODE> </CODE>p<CODE> </CODE><CODE>=</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Mutex.lock<CODE> </CODE>m<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>while</B><CODE> </CODE><TT>(</TT>ip<CODE>-</CODE>ic<CODE>+</CODE><CODE>1</CODE><CODE> </CODE><CODE>&gt;</CODE><CODE> </CODE>Array.length<TT>(</TT>buffer<TT>)</TT><TT>)</TT><CODE> </CODE><B>do</B><CODE> </CODE>Condition.wait<CODE> </CODE>c<CODE> </CODE>m<CODE> </CODE><B>done</B><CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>buffer<CODE>.</CODE><TT>(</TT>ip<CODE> </CODE><B>mod</B><CODE> </CODE>taille<TT>)</TT><CODE> </CODE><CODE>&lt;-</CODE><CODE> </CODE>p<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>self#display1()<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>ip<CODE> </CODE><CODE>&lt;-</CODE><CODE> </CODE>ip<CODE>+</CODE><CODE>1</CODE><CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Mutex.unlock<CODE> </CODE>m<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Condition.signal<CODE> </CODE>c<BR><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>display2<CODE> </CODE>()<CODE> </CODE><CODE>=</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>i<CODE> </CODE><CODE>=</CODE><CODE> </CODE>ic<CODE> </CODE><B>mod</B><CODE> </CODE>taille<CODE> </CODE><B>in</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Printf.printf<CODE> </CODE><CODE>"Retrait (%d)%s\n"</CODE><CODE> </CODE>i<CODE> </CODE><TT>(</TT><TT>(</TT>buffer<CODE>.</CODE><TT>(</TT>i<TT>)</TT><TT>)</TT>#nom<TT>)</TT><BR><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>prendre<CODE> </CODE>()<CODE> </CODE><CODE>=</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Mutex.lock<CODE> </CODE>m<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>while</B><TT>(</TT>ip<CODE> </CODE><CODE>==</CODE><CODE> </CODE>ic<TT>)</TT><CODE> </CODE><B>do</B><CODE> </CODE>Condition.wait<CODE> </CODE>c<CODE> </CODE>m<CODE> </CODE><B>done</B><CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>self#display2()<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>r<CODE> </CODE><CODE>=</CODE><CODE> </CODE>buffer<CODE>.</CODE><TT>(</TT>ic<CODE> </CODE><B>mod</B><CODE> </CODE>taille<TT>)</TT><CODE> </CODE><B>in</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>ic<CODE>&lt;-</CODE><CODE> </CODE>ic<CODE>+</CODE><CODE>1</CODE><CODE> </CODE>;<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Mutex.unlock<CODE> </CODE>m<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Condition.signal<CODE> </CODE>c<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>r<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>end</B><CODE> </CODE>;;<BR><CODE>class magasin :</CODE><BR><CODE>  int -&gt;</CODE><BR><CODE>  object</CODE><BR><CODE>    val mutable buffer : produit array</CODE><BR><CODE>    val c : Condition.t</CODE><BR><CODE>    val mutable ic : int</CODE><BR><CODE>    val mutable ip : int</CODE><BR><CODE>    val m : Mutex.t</CODE><BR><CODE>    val mutable np : int</CODE><BR><CODE>    val mutable taille : int</CODE><BR><CODE>    method deposer : produit -&gt; unit</CODE><BR><CODE>    method display1 : unit -&gt; unit</CODE><BR><CODE>    method display2 : unit -&gt; unit</CODE><BR><CODE>    method prendre : unit -&gt; produit</CODE><BR><CODE>  end</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("8_APPEND/PCcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script>

<PRE>
<CODE> </CODE><BR><B>class</B><CODE> </CODE>show<CODE> </CODE><CODE>:</CODE><CODE> </CODE>int<CODE> </CODE>-&gt;<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><B>object</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>val</B><CODE> </CODE><B>mutable</B><CODE> </CODE>buffer<CODE> </CODE><CODE>:</CODE><CODE> </CODE>product<CODE> </CODE>array<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>val</B><CODE> </CODE>c<CODE> </CODE><CODE>:</CODE><CODE> </CODE>Condition.t<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>val</B><CODE> </CODE><B>mutable</B><CODE> </CODE>ic<CODE> </CODE><CODE>:</CODE><CODE> </CODE>int<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>val</B><CODE> </CODE><B>mutable</B><CODE> </CODE>ip<CODE> </CODE><CODE>:</CODE><CODE> </CODE>int<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>val</B><CODE> </CODE>m<CODE> </CODE><CODE>:</CODE><CODE> </CODE>Mutex.t<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>val</B><CODE> </CODE><B>mutable</B><CODE> </CODE>np<CODE> </CODE><CODE>:</CODE><CODE> </CODE>int<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>val</B><CODE> </CODE>size<CODE> </CODE><CODE>:</CODE><CODE> </CODE>int<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>dispose<CODE> </CODE><CODE>:</CODE><CODE> </CODE>product<CODE> </CODE>-&gt;<CODE> </CODE>unit<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>acquire<CODE> </CODE><CODE>:</CODE><CODE> </CODE>unit<CODE> </CODE>-&gt;<CODE> </CODE>product<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><B>end</B><CODE> </CODE><BR>

</PRE>
 
The indexes <TT>ic</TT> and <TT>ip</TT> are manipulated by the producers 
and the consumers, respectively. 
The index <TT>ic</TT> holds the index of the last product taken and <TT>ip</TT>
that of the last product stored. The counter <TT>np</TT> gives the number 
of products in stock. Mutual exclusion and control of the waiting of 
producers and consumers will be managed by the methods of this class. <BR>
<BR>

<LI> Define a function <TT><A id="a308__9_APPEND/PCcor.ml.tex" href="javascript: void showMessage('9_APPEND/PCcor.ml.tex')" class="mousable"><SPAN style=""><!-- 9,APPEND/PCcor.ml.tex,consumer -->consumer</SPAN></A></TT>:  
shop<CODE> </CODE>-&gt;<CODE> </CODE>string<CODE> </CODE>-&gt;<CODE> </CODE>unit. 
<!-- POPUP DEFINITION -->
<layer id="l__9_APPEND/PCcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","9_APPEND/PCcor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>let</B><CODE> </CODE>consommateur<CODE> </CODE>mag<CODE> </CODE>na<CODE> </CODE><CODE>=</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>while</B><CODE> </CODE><B>true</B><CODE> </CODE><B>do</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>p<CODE> </CODE><CODE>=</CODE><CODE> </CODE>mag#prendre()<CODE> </CODE><B>in</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Printf.printf<CODE> </CODE><CODE>"Le consommateur %s prend le produit %s\n"</CODE><CODE> </CODE>na<CODE> </CODE>p#nom<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>flush<CODE> </CODE>stdout<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Thread.delay<TT>(</TT>Random.float<TT>(</TT><CODE>3</CODE><CODE>.</CODE><CODE>0</CODE><TT>)</TT><TT>)</TT><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>done</B><CODE> </CODE>;;<BR><CODE>val consommateur :</CODE><BR><CODE>  &lt; prendre : unit -&gt; &lt; nom : string; .. &gt;; .. &gt; -&gt; string -&gt; unit = &lt;fun&gt;</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("9_APPEND/PCcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script>
<LI> Define a function <TT>create_product</TT> 
of type <I>string -&gt; product</I>. The name given to a product will be 
composed of the string passed as an argument concatenated with a product 
number incremented at every invocation of the function.<BR>Use this function to define 
<TT><A id="a309__10_APPEND/PCcor.ml.tex" href="javascript: void showMessage('10_APPEND/PCcor.ml.tex')" class="mousable"><SPAN style=""><!-- 10,APPEND/PCcor.ml.tex,producer -->producer</SPAN></A></TT>:  
shop<CODE> </CODE>-&gt;<CODE> </CODE>string<CODE> </CODE>-&gt;<CODE> </CODE>unit. 
<!-- POPUP DEFINITION -->
<layer id="l__10_APPEND/PCcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","10_APPEND/PCcor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>let</B><CODE> </CODE>producteur<CODE> </CODE><CODE>=</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>num<CODE> </CODE><CODE>=</CODE><CODE> </CODE>ref<CODE> </CODE><CODE>0</CODE><CODE> </CODE><B>in</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>creer_produit<CODE> </CODE>()<CODE> </CODE><CODE>=</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>p<CODE> </CODE><CODE>=</CODE><CODE> </CODE><B>new</B><CODE> </CODE>produit<TT>(</TT><CODE>"lessive-"</CODE><CODE>^</CODE><TT>(</TT>string_of_int<CODE> </CODE><CODE>!</CODE>num<TT>)</TT><TT>)</TT><CODE> </CODE><B>in</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>incr<CODE> </CODE>num<CODE> </CODE>;<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>p<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>in</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>function</B><CODE> </CODE>mag<CODE> </CODE>-&gt;<CODE> </CODE><B>function</B><CODE> </CODE>nm<CODE> </CODE>-&gt;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>while</B><CODE> </CODE><B>true</B><CODE> </CODE><B>do</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>p<CODE> </CODE><CODE>=</CODE><CODE> </CODE>creer_produit<CODE> </CODE>()<CODE> </CODE><B>in</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>mag#deposer<TT>(</TT>p<TT>)</TT><CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Printf.printf<CODE>"Production de %s\n"</CODE><CODE> </CODE>p#nom<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>flush<CODE> </CODE>stdout<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Thread.delay<CODE> </CODE><TT>(</TT>Random.float<CODE> </CODE><TT>(</TT><CODE>1</CODE><CODE>.</CODE><CODE>0</CODE><TT>)</TT><TT>)</TT><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>done</B><CODE> </CODE>;;<BR><CODE>val producteur : &lt; deposer : produit -&gt; '_a; _.. &gt; -&gt; '_b -&gt; unit = &lt;fun&gt;</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("10_APPEND/PCcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script></OL> <HR>
<A HREF="book-ora178.html"><IMG SRC ="previous_motif.gif" ALT="Previous"></A>
<A HREF="index.html"><IMG SRC ="contents_motif.gif" ALT="Contents"></A>
<A HREF="book-ora180.html"><IMG SRC ="next_motif.gif" ALT="Next"></A>
</BODY>
</HTML>
